package com.yupi.yupicturebackend.service;

import com.yupi.yupicturebackend.model.dto.search.*;
import com.yupi.yupicturebackend.model.entity.Picture;

import java.util.List;
import java.util.Map;

/**
 * 智能搜索服务
 *
 * @author yupi
 */
public interface IntelligentSearchService {

    /**
     * 以图搜图
     *
     * @param queryImageUrl 查询图片URL
     * @param searchConfig 搜索配置
     * @param userId 用户ID
     * @return 搜索结果
     */
    ImageSearchResult searchByImage(String queryImageUrl, ImageSearchConfig searchConfig, Long userId);

    /**
     * 语义搜索
     *
     * @param query 搜索查询
     * @param searchConfig 搜索配置
     * @param userId 用户ID
     * @return 搜索结果
     */
    SemanticSearchResult semanticSearch(String query, SemanticSearchConfig searchConfig, Long userId);

    /**
     * 智能推荐
     *
     * @param userId 用户ID
     * @param recommendConfig 推荐配置
     * @return 推荐结果
     */
    RecommendationResult intelligentRecommend(Long userId, RecommendationConfig recommendConfig);

    /**
     * 个性化内容发现
     *
     * @param userId 用户ID
     * @param discoveryConfig 发现配置
     * @return 发现结果
     */
    ContentDiscoveryResult personalizedDiscovery(Long userId, ContentDiscoveryConfig discoveryConfig);

    /**
     * 智能标签推荐
     *
     * @param imageUrl 图片URL
     * @param tagConfig 标签配置
     * @param userId 用户ID
     * @return 标签推荐结果
     */
    TagRecommendationResult recommendTags(String imageUrl, TagRecommendationConfig tagConfig, Long userId);

    /**
     * 相似用户发现
     *
     * @param userId 用户ID
     * @param similarityConfig 相似度配置
     * @return 相似用户结果
     */
    SimilarUserResult findSimilarUsers(Long userId, UserSimilarityConfig similarityConfig);

    /**
     * 生成搜索建议
     *
     * @param partialQuery 部分查询
     * @param suggestionConfig 建议配置
     * @param userId 用户ID
     * @return 搜索建议结果
     */
    SearchSuggestionResult generateSearchSuggestions(String partialQuery, SearchSuggestionConfig suggestionConfig, Long userId);

    /**
     * 记录搜索历史
     *
     * @param userId 用户ID
     * @param query 搜索查询
     * @param searchType 搜索类型
     * @param resultCount 结果数量
     * @param searchTime 搜索耗时
     * @return 是否成功
     */
    boolean recordSearchHistory(Long userId, String query, String searchType, Integer resultCount, Long searchTime);

    /**
     * 记录推荐日志
     *
     * @param userId 用户ID
     * @param recommendationType 推荐类型
     * @param recommendedItems 推荐物品
     * @param processingTime 处理耗时
     * @return 是否成功
     */
    boolean recordRecommendationLog(Long userId, String recommendationType, List<String> recommendedItems, Long processingTime);

    /**
     * 获取用户搜索历史
     *
     * @param userId 用户ID
     * @param limit 限制数量
     * @return 搜索历史列表
     */
    List<Map<String, Object>> getUserSearchHistory(Long userId, Integer limit);

    /**
     * 获取热门搜索词
     *
     * @param limit 限制数量
     * @return 热门搜索词列表
     */
    List<Map<String, Object>> getPopularSearchQueries(Integer limit);

    /**
     * 获取搜索统计
     *
     * @param userId 用户ID（可选）
     * @return 搜索统计数据
     */
    Map<String, Object> getSearchStatistics(Long userId);

    /**
     * 更新用户偏好
     *
     * @param userId 用户ID
     * @param pictureId 图片ID
     * @param action 用户行为 (view, like, share, download)
     * @return 是否成功
     */
    boolean updateUserPreference(Long userId, Long pictureId, String action);

    /**
     * 获取用户偏好画像
     *
     * @param userId 用户ID
     * @return 用户偏好画像
     */
    Map<String, Object> getUserPreferenceProfile(Long userId);

    /**
     * 计算图片相似度
     *
     * @param imageUrl1 图片1 URL
     * @param imageUrl2 图片2 URL
     * @return 相似度分数
     */
    Double calculateImageSimilarity(String imageUrl1, String imageUrl2);

    /**
     * 批量计算图片相似度
     *
     * @param queryImageUrl 查询图片URL
     * @param candidateImageUrls 候选图片URL列表
     * @return 相似度结果列表
     */
    List<Map<String, Object>> batchCalculateSimilarity(String queryImageUrl, List<String> candidateImageUrls);

    /**
     * 构建用户特征向量
     *
     * @param userId 用户ID
     * @return 特征向量
     */
    double[] buildUserFeatureVector(Long userId);

    /**
     * 构建图片特征向量
     *
     * @param imageUrl 图片URL
     * @return 特征向量
     */
    double[] buildImageFeatureVector(String imageUrl);

    /**
     * 向量相似度搜索
     *
     * @param queryVector 查询向量
     * @param topK 返回前K个结果
     * @return 相似结果列表
     */
    List<Map<String, Object>> vectorSimilaritySearch(double[] queryVector, Integer topK);

    /**
     * 更新推荐模型
     *
     * @param modelType 模型类型
     * @return 是否成功
     */
    boolean updateRecommendationModel(String modelType);

    /**
     * 评估推荐效果
     *
     * @param userId 用户ID
     * @param recommendationType 推荐类型
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 评估结果
     */
    Map<String, Object> evaluateRecommendationPerformance(Long userId, String recommendationType, String startDate, String endDate);

    /**
     * A/B测试推荐算法
     *
     * @param userId 用户ID
     * @param algorithmA 算法A
     * @param algorithmB 算法B
     * @param testConfig 测试配置
     * @return 测试结果
     */
    Map<String, Object> abTestRecommendationAlgorithms(Long userId, String algorithmA, String algorithmB, Map<String, Object> testConfig);
}
